package com.niuwa.p2p.dao.customer;

import java.util.List;
import java.util.Map;

import com.niuwa.p2p.dao.MyBatisDao;
import com.niuwa.p2p.entity.customer.CustLoginLog;
import com.niuwa.p2p.entity.customer.CustPwdReset;
import com.niuwa.p2p.entity.customer.Customer;
import com.niuwa.p2p.vo.customer.BaseCustomerInfoVo;
import com.niuwa.p2p.vo.customer.BaseInvestVo;
import com.niuwa.p2p.vo.customer.BaseLoanVo;
import com.niuwa.p2p.vo.customer.CustomerVo;
import com.niuwa.p2p.vo.front.account.CustomerInformation;

@MyBatisDao
public interface CustomerDao {

	/**
	 * 统计用户个数
	 * 根据paramMap，统计出需要的客户数
	 * 例：适用于分页的时候，选取当前页的客户条数
	 * 
	 * @param paramMap 过滤得条件Map
	 * @return 总客户数
	 */
	public int count(Map<String, Object> paramMap);
	
	
	/**
	 * 选取客户集合
	 * 根据paramMap，选取需要的客户集合
	 * 例：适用于分页的时候，选取当前页的客户集合
	 * 
	 * @param paramMap 过滤得条件Map
	 * @return List<User> 客户集合 
	 */
	public List<CustomerVo> selectCustomerBySelective(Map<String, Object> paramMap);

	
	/**
	 * 通过客户ID 选取单个客户 
	 * 
	 * @param  id   客户 id
	 * @return User 客户 实体
	 * @throws Exception
	 */
	public Customer selectByCustId(long id);
	
	/**
	 * 更新客户 
	 * 
	 * @param user 更新的客户 对象
	 * @throws Exception
	 */
	public int updateByCustSelective(Customer customer) throws Exception;

	
	/**
	 * 查询投资用户列表
	 * @param BaseInvestVo
	 * @return
	 */
	public List<BaseInvestVo> selectInvestBySelective(Map<String, Object> paramMap);
	
	/**
	 * 查询投资用户数
	 * @param BaseInvestVo
	 * @return
	 */
	public int selectInvestCountBySelective(Map<String, Object> paramMap);
	
	/**
	 * 查询借款用户列表
	 * @param BaseInvestVo
	 * @return
	 */
	public List<BaseLoanVo> selectLoanBySelective(Map<String, Object> paramMap);
	
	/**
	 * 查询借款用户数
	 * @param BaseInvestVo
	 * @return
	 */
	public int selectLoanCountBySelective(Map<String, Object> paramMap);
	
	/**
	 * 统计注册用户数
	 * 
	 * @param paramMap
	 * @return
	 */
	public int seachRegUserListCount(Map<String, Object> paramMap);
	
	/**
	 * 查询注册用户列表
	 * 
	 * @param paramMap
	 * @return
	 */
	public List<BaseCustomerInfoVo> seachRegUserList(Map<String, Object> paramMap);
	
	
	/**
	 * 注册用户
	 * 
	 * @param customer
	 * @throws Exception
	 */
	public void insertUser(Customer customer) throws Exception;
	
	/**
	 * 通过登录名称查询用户信息
	 * 
	 * @param loginName
	 * @return
	 * @throws Exception
	 */
	public Customer findByLoginName(String loginName) throws Exception;
	
	/**
	 * 查询推荐码是否存在
	 * 
	 * @param recommendedCode
	 * @return
	 * @throws Exception
	 */
	public int selectCodeByRecommended(String recommendedCode) throws Exception;
	
	/**
	 * 根据手机号查询用户信息
	 * 
	 * @param phoneNo
	 * @return User
	 */
	public Customer findCustomerByMobile(String mobile);

	/**
	 * 根据ID查询用户信息
	 * 
	 * @param id
	 * @return
	 */
	public Customer findCustomerById(String id);
	
	
	/**
	 * 获取用户认证信息【web】
	 * @param id
	 * @return
	 * @throws Exception
	 */
	public CustomerInformation getCustomerAuth(long id)throws Exception;
	
	/**
	 * 修改密码【web】
	 * @param paramMap
	 * @return
	 */
	public int updatePassWrod(Map<String, Object> paramMap);
	
	/**
	 * 通过登录密码、身份证号、安全保护问题、问题答案获取用户 [web安全管理]
	 * @param paramMap
	 * @return
	 */
	public Customer getCustomerBySelective(Map<String, Object> paramMap);
	
	/**
	 * 
	 * 查询登录列表条数
	 * @param paramMap
	 * @return  int
	 */
	
  public int searchLoginInfoListCount(Map<String, Object> paramMap);
	
	
	/**
	 * 
	 * 查询登录列表
	 * @param paramMap
	 * @return List<BaseCustomerInfoVo>
	 */
	
	 public List<CustLoginLog> searchLoginInfoList(Map<String, Object> paramMap);
	
	/**
	 * 
	 * 查询密码重置列表条数
	 * @param paramMap
	 * @return int
	 */
	
	public int searchPasswordResetListCount(Map<String, Object> paramMap);
	
	
	/**
	 * 
	 * 查询密码重置列表
	 * @param paramMap
	 * @return List<BaseCustomerInfoVo>
	 */
	
	public List<CustPwdReset> searchPasswordResetList(Map<String, Object> paramMap);
	
	/**
	 * 根据登录名或手机号码查询用户信息
	 * @param param
	 * @return
	 */
	public Map<String, Object> findCustByLoginNameOrMobile(String param);
	
	
	//====================== 前台使用  Add by bwz begin ===============================
	
	/**
	 * @Description: 查询用户投资信息
	 * @param customerId
	 * @return
	 */
	public BaseInvestVo selectUserInvestInfo(long customerId);
	
	
	
	//====================== 前台使用  Add by bwz end =================================

	public Map<String, Object> selectCustomerInfo(Map<String, Object> param);
	
	/**
	 * 通过Id，手机号查询用户 [开通资金账户前的判断]
	 * @param param
	 * @return
	 */
	public Map<String, Object> findCustomerByIdAndMobile(Map<String, Object> param);
	
	
	/**
	 * 新增登录日志记录
	 * 
	 * @param custLoginLog
	 * @return
	 */
	public int insertLoginLog(CustLoginLog custLoginLog);
	
	/**
	 * 通过邮箱获取用户
	 * @param email
	 * @return
	 */
	public Customer selectByEmail(String email);
}
